//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_exported import SotoCore

/// Service object for interacting with AWS BCMRecommendedActions service.
///
/// You can use the Billing and Cost Management Recommended Actions API to programmatically query your best practices and recommendations to optimize your costs. The Billing and Cost Management Recommended Actions API provides the following endpoint:    https://bcm-recommended-actions.us-east-1.api.aws
public struct BCMRecommendedActions: AWSService {
    // MARK: Member variables

    /// Client used for communication with AWS
    public let client: AWSClient
    /// Service configuration
    public let config: AWSServiceConfig

    // MARK: Initialization

    /// Initialize the BCMRecommendedActions client
    /// - parameters:
    ///     - client: AWSClient used to process requests
    ///     - region: Region of server you want to communicate with. This will override the partition parameter.
    ///     - partition: AWS partition where service resides, standard (.aws), china (.awscn), government (.awsusgov).
    ///     - endpoint: Custom endpoint URL to use instead of standard AWS servers
    ///     - middleware: Middleware chain used to edit requests before they are sent and responses before they are decoded 
    ///     - timeout: Timeout value for HTTP requests
    ///     - byteBufferAllocator: Allocator for ByteBuffers
    ///     - options: Service options
    public init(
        client: AWSClient,
        region: SotoCore.Region? = nil,
        partition: AWSPartition = .aws,
        endpoint: String? = nil,
        middleware: AWSMiddlewareProtocol? = nil,
        timeout: TimeAmount? = nil,
        byteBufferAllocator: ByteBufferAllocator = ByteBufferAllocator(),
        options: AWSServiceConfig.Options = []
    ) {
        self.client = client
        self.config = AWSServiceConfig(
            region: region,
            partition: region?.partition ?? partition,
            amzTarget: "AWSBillingAndCostManagementRecommendedActions",
            serviceName: "BCMRecommendedActions",
            serviceIdentifier: "bcm-recommended-actions",
            serviceProtocol: .json(version: "1.0"),
            apiVersion: "2024-11-14",
            endpoint: endpoint,
            errorType: BCMRecommendedActionsErrorType.self,
            middleware: middleware,
            timeout: timeout,
            byteBufferAllocator: byteBufferAllocator,
            options: options
        )
    }





    // MARK: API Calls

    /// Returns a list of recommended actions that match the filter criteria.
    @Sendable
    @inlinable
    public func listRecommendedActions(_ input: ListRecommendedActionsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListRecommendedActionsResponse {
        try await self.client.execute(
            operation: "ListRecommendedActions", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a list of recommended actions that match the filter criteria.
    ///
    /// Parameters:
    ///   - filter: The criteria that you want all returned recommended actions to match.
    ///   - maxResults: The maximum number of results to return in the response.
    ///   - nextToken: The pagination token that indicates the next set of results that you want to retrieve.
    ///   - logger: Logger use during operation
    @inlinable
    public func listRecommendedActions(
        filter: RequestFilter? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListRecommendedActionsResponse {
        let input = ListRecommendedActionsRequest(
            filter: filter, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listRecommendedActions(input, logger: logger)
    }
}

extension BCMRecommendedActions {
    /// Initializer required by `AWSService.with(middlewares:timeout:byteBufferAllocator:options)`. You are not able to use this initializer directly as there are not public
    /// initializers for `AWSServiceConfig.Patch`. Please use `AWSService.with(middlewares:timeout:byteBufferAllocator:options)` instead.
    public init(from: BCMRecommendedActions, patch: AWSServiceConfig.Patch) {
        self.client = from.client
        self.config = from.config.with(patch: patch)
    }
}

// MARK: Paginators

@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
extension BCMRecommendedActions {
    /// Return PaginatorSequence for operation ``listRecommendedActions(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listRecommendedActionsPaginator(
        _ input: ListRecommendedActionsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListRecommendedActionsRequest, ListRecommendedActionsResponse> {
        return .init(
            input: input,
            command: self.listRecommendedActions,
            inputKey: \ListRecommendedActionsRequest.nextToken,
            outputKey: \ListRecommendedActionsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listRecommendedActions(_:logger:)``.
    ///
    /// - Parameters:
    ///   - filter: The criteria that you want all returned recommended actions to match.
    ///   - maxResults: The maximum number of results to return in the response.
    ///   - logger: Logger used for logging
    @inlinable
    public func listRecommendedActionsPaginator(
        filter: RequestFilter? = nil,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListRecommendedActionsRequest, ListRecommendedActionsResponse> {
        let input = ListRecommendedActionsRequest(
            filter: filter, 
            maxResults: maxResults
        )
        return self.listRecommendedActionsPaginator(input, logger: logger)
    }
}

extension BCMRecommendedActions.ListRecommendedActionsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> BCMRecommendedActions.ListRecommendedActionsRequest {
        return .init(
            filter: self.filter,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}
